import $ from 'jquery'
import { rowLocationByIndex, colLocationByIndex } from '../global/location'
import { countfunc } from '../global/count'
import { getBorderInfoCompute } from '../global/border'
import { isRealNum } from '../global/validate'
import { genarate, update } from '../global/format'
import { jfrefreshgrid } from '../global/refresh'
import editor from '../global/editor'
import formula from '../global/formula'
import conditionformat from './conditionformat'
import {checkProtectionLockedRangeList} from './protection'
import { selectHightlightShow } from './select'
import { getSheetIndex } from '../methods/get'
import { getObjType, replaceHtml } from '../utils/util'
import Store from '../store'
import locale from '../locale/locale'
import dayjs from 'dayjs'

//选区下拉
const luckysheetDropCell = {
    iconHtml: '<div id="luckysheet-dropCell-icon" style="position: absolute;padding: 2px;background-color: #f1f1f1;z-index: 990;cursor: pointer;">'+
                '<div id="icon_dropCell"></div>'+
              '</div>',
    typeListHtml: '<div id="luckysheet-dropCell-typeList" class="luckysheet-cols-menu luckysheet-rightgclick-menu luckysheet-mousedown-cancel">'+
                    '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="0">'+
                        '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+
                            '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${copyCell}'+
                        '</div>'+
                    '</div>'+
                    '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="1">'+
                        '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+
                            '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${sequence}'+
                        '</div>'+
                    '</div>'+
                    '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="2">'+
                        '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+
                            '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${onlyFormat}'+
                        '</div>'+
                    '</div>'+
                    '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="3">'+
                        '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+
                            '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${noFormat}'+
                        '</div>'+
                    '</div>'+
                    '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="4">'+
                        '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+
                            '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${day}'+
                        '</div>'+
                    '</div>'+
                    '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="5">'+
                        '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+
                            '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${workDay}'+
                        '</div>'+
                    '</div>'+
                    '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="6">'+
                        '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+
                            '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${month}'+
                        '</div>'+
                    '</div>'+
                    '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="7">'+
                        '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+
                            '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${year}'+
                        '</div>'+
                    '</div>'+
                    '<div class="luckysheet-cols-menuitem luckysheet-mousedown-cancel" data-type="8">'+
                        '<div class="luckysheet-cols-menuitem-content luckysheet-mousedown-cancel" style="padding: 3px 2px;">'+
                            '<span style="margin-right:5px;width:13px;display:inline-block;" class="icon luckysheet-mousedown-cancel"></span>${chineseNumber}'+
                        '</div>'+
                    '</div>'+
                  '</div>',
    copyRange: {}, //复制范围
    applyRange: {}, //应用范围
    applyType: null, //0复制单元格，1填充序列，2仅填充格式，3不带格式填充，4以天数填充，5以工作日填充，6以月填充，7以年填充，8以中文小写数字序列填充
    direction: null, //down-往下拖拽，right-往右拖拽，up-往上拖拽，left-往左拖拽
    chnNumChar: {'零': 0, '一': 1, '二': 2, '三': 3, '四': 4, '五': 5, '六': 6, '七': 7, '八': 8, '九': 9},
    chnNameValue: {
        '十': {value: 10, secUnit: false},
        '百': {value: 100, secUnit: false},
        '千': {value: 1000, secUnit: false},
        '万': {value: 10000, secUnit: true},
        '亿': {value: 100000000, secUnit: true}
    },
    ChineseToNumber: function(chnStr){
        let _this = this

        let rtn = 0
        let section = 0
        let number = 0
        let secUnit = false
        let str = chnStr.split('')

        for(let i = 0; i < str.length; i++){
            let num = _this.chnNumChar[str[i]]

            if(typeof num != 'undefined'){
                number = num

                if(i == str.length - 1){
                    section += number
                }
            }
            else{
                let unit = _this.chnNameValue[str[i]].value
                secUnit = _this.chnNameValue[str[i]].secUnit

                if(secUnit){
                    section = (section + number) * unit
                    rtn += section
                    section = 0
                }
                else{
                    section += (number * unit)
                }

                number = 0
            }
        }

        return rtn + section
    },
    chnNumChar2: ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'],
    chnUnitSection: ['', '万', '亿', '万亿', '亿亿'],
    chnUnitChar: ['', '十', '百', '千'],
    SectionToChinese: function(section){
        let _this = this

        let strIns = '', chnStr = ''
        let unitPos = 0
        let zero = true

        while(section > 0){
            let v = section % 10

            if(v == 0){
                if(!zero){
                    zero = true
                    chnStr = _this.chnNumChar2[v] + chnStr
                }
            }
            else{
                zero = false
                strIns = _this.chnNumChar2[v]
                strIns += _this.chnUnitChar[unitPos]
                chnStr = strIns + chnStr
            }

            unitPos++
            section = Math.floor(section / 10)
        }

        return chnStr
    },
    NumberToChinese: function(num){
        let _this = this

        let unitPos = 0
        let strIns = '', chnStr = ''
        let needZero = false

        if(num == 0){
            return _this.chnNumChar2[0]
        }
        while(num > 0){
            let section = num % 10000

            if(needZero){
                chnStr = _this.chnNumChar2[0] + chnStr
            }

            strIns = _this.SectionToChinese(section)
            strIns += (section != 0) ? _this.chnUnitSection[unitPos] : _this.chnUnitSection[0]
            chnStr = strIns + chnStr
            needZero = (section < 1000) && (section > 0)
            num = Math.floor(num / 10000)
            unitPos++
        }

        return chnStr
    },
    isChnNumber: function(txt){
        let _this = this

        let isChnNumber = true

        if(txt.length == 1){
            if(txt == '日' || (txt in _this.chnNumChar)){
                isChnNumber = true
            }
            else{
                isChnNumber = false
            }
        }
        else{
            let str = txt.split('')
            for(let i = 0; i < str.length; i++){
                if(!((str[i] in _this.chnNumChar) || (str[i] in _this.chnNameValue))){
                    isChnNumber = false
                    break
                }
            }
        }

        return isChnNumber
    },
    isExtendNumber: function(txt){
        let reg = /0|([1-9]+[0-9]*)/g
        let isExtendNumber = reg.test(txt)

        if(isExtendNumber){
            let match = txt.match(reg)
            let matchTxt = match[match.length - 1]
            let matchIndex = txt.lastIndexOf(matchTxt)
            let beforeTxt = txt.substr(0, matchIndex)
            let afterTxt = txt.substr(matchIndex + matchTxt.length)

            return [isExtendNumber, Number(matchTxt), beforeTxt, afterTxt]
        }
        else {
            return [isExtendNumber]
        }
    },
    isChnWeek1: function(txt){
        let _this = this

        let isChnWeek1
        if(txt.length == 1){
            if(txt == '日' || _this.ChineseToNumber(txt) < 7){
                isChnWeek1 = true
            }
            else{
                isChnWeek1 = false
            }
        }
        else{
            isChnWeek1 = false
        }

        return isChnWeek1
    },
    isChnWeek2: function(txt){
        let isChnWeek2
        if(txt.length == 2){
            if(txt == '周一' || txt == '周二' || txt == '周三' || txt == '周四' || txt == '周五' || txt == '周六' || txt == '周日'){
                isChnWeek2 = true
            }
            else{
                isChnWeek2 = false
            }
        }
        else{
            isChnWeek2 = false
        }

        return isChnWeek2
    },
    isChnWeek3: function(txt){
        let isChnWeek3
        if(txt.length == 3){
            if(txt == '星期一' || txt == '星期二' || txt == '星期三' || txt == '星期四' || txt == '星期五' || txt == '星期六' || txt == '星期日'){
                isChnWeek3 = true
            }
            else{
                isChnWeek3 = false
            }
        }
        else{
            isChnWeek3 = false
        }

        return isChnWeek3
    },
    createIcon: function(){
        let _this = this

        let copy_r = _this.copyRange['row'][1],
            copy_c = _this.copyRange['column'][1]
        let apply_r = _this.applyRange['row'][1],
            apply_c = _this.applyRange['column'][1]

        let row_index, col_index
        if(apply_r >= copy_r && apply_c >= copy_c){
            row_index = apply_r
            col_index = apply_c
        }
        else{
            row_index = copy_r
            col_index = copy_c
        }

        let row = rowLocationByIndex(row_index)[1]
        let col = colLocationByIndex(col_index)[1]

        $('#luckysheet-dropCell-icon').remove()
        $('#luckysheet-cell-main').append(_this.iconHtml)
        $('#luckysheet-dropCell-icon').css({'left': col, 'top': row})

        //点击icon
        $('#luckysheet-dropCell-icon').mouseover(function(){
            $(this).css('background-color', '#ffe8e8')
        }).mouseleave(function(){
            $(this).css('background-color', '#f1f1f1')
        }).mousedown(function(event){
            $('#luckysheet-dropCell-typeList').remove()
            const _locale = locale()
            const locale_dropCell = _locale.dropCell
            $('body').append(replaceHtml(_this.typeListHtml,{
                copyCell:locale_dropCell.copyCell,
                sequence:locale_dropCell.sequence,
                onlyFormat:locale_dropCell.onlyFormat,
                noFormat:locale_dropCell.noFormat,
                day:locale_dropCell.day,
                workDay:locale_dropCell.workDay,
                month:locale_dropCell.month,
                year:locale_dropCell.year,
                chineseNumber:locale_dropCell.chineseNumber,
            }))

            let typeItemHide = _this.typeItemHide()
            if(!typeItemHide[0] && !typeItemHide[1] && !typeItemHide[2] && !typeItemHide[3] && !typeItemHide[4] && !typeItemHide[5] && !typeItemHide[6]){
                $('#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=1]').hide()
                $('#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=4]').hide()
                $('#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=5]').hide()
                $('#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=6]').hide()
                $('#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=7]').hide()
                $('#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=8]').hide()
            }

            if(!typeItemHide[2]){
                $('#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=4]').hide()
                $('#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=5]').hide()
                $('#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=6]').hide()
                $('#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=7]').hide()
            }

            if(!typeItemHide[3]){
                $('#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type=8]').hide()
            }

            let left = $(this).offset().left
            let top = $(this).offset().top + 25
            let winH = $(window).height(), winW = $(window).width()
            let menuW = $('#luckysheet-dropCell-typeList').width(),
                menuH = $('#luckysheet-dropCell-typeList').height()

            if (left + menuW > winW) {
                left = left - menuW
            }

            if (top + menuH > winH) {
                top = top - menuH - 38
            }

            if (top < 0) {
                top = 0
            }

            $('#luckysheet-dropCell-typeList').css({'left': left, 'top': top}).show()
            $('#luckysheet-dropCell-icon').mouseleave(function(){ $(this).css('backgroundColor', '#ffe8e8') })

            let type = _this.applyType
            $('#luckysheet-dropCell-typeList .luckysheet-cols-menuitem[data-type='+ type +']').find('span').append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>')
            event.stopPropagation()
        })

        //点击数据填充类型
        $(document).off('click.dCtypeList').on('click.dCtypeList', '#luckysheet-dropCell-typeList .luckysheet-cols-menuitem', function(){
            $('#luckysheet-dropCell-typeList .fa-check').remove()
            $(this).find('span').append('<i class="fa fa-check luckysheet-mousedown-cancel"></i>')

            let type = $(this).attr('data-type')
            _this.applyType = type

            _this.update()

            $('#luckysheet-dropCell-typeList').hide()
            $('#luckysheet-dropCell-icon').css('backgroundColor', '#f1f1f1')
            $('#luckysheet-dropCell-icon').mouseleave(function(){ $(this).css('backgroundColor', '#f1f1f1') })

            countfunc()
        })
    },
    typeItemHide: function(){
        let _this = this

        let copyRange = _this.copyRange
        let str_r = copyRange['row'][0], end_r = copyRange['row'][1]
        let str_c = copyRange['column'][0], end_c = copyRange['column'][1]

        let hasNumber = false,
            hasExtendNumber = false,
            hasDate = false,
            hasChn = false,
            hasChnWeek1 = false,
            hasChnWeek2 = false,
            hasChnWeek3 = false

        for(let r = str_r; r <= end_r; r++){
            for(let c = str_c; c <= end_c; c++){
                if(Store.flowdata[r][c]){
                    let cell = Store.flowdata[r][c]

                    if(getObjType(cell) == 'object' && cell['v'] != null && cell['f'] == null){
                        if(cell['ct'] != null && cell['ct'].t == 'n'){
                            hasNumber = true
                        }
                        else if(cell['ct'] != null && cell['ct'].t == 'd'){
                            hasDate = true
                        }
                        else if(_this.isExtendNumber(cell['m'])[0]){
                            hasExtendNumber = true
                        }
                        else if(_this.isChnNumber(cell['m']) && cell['m'] != '日'){
                            hasChn = true
                        }
                        else if(cell['m'] == '日'){
                            hasChnWeek1 = true
                        }
                        else if(_this.isChnWeek2(cell['m'])){
                            hasChnWeek2 = true
                        }
                        else if(_this.isChnWeek3(cell['m'])){
                            hasChnWeek3 = true
                        }
                    }
                }
            }
        }

        return [hasNumber, hasExtendNumber, hasDate, hasChn, hasChnWeek1, hasChnWeek2, hasChnWeek3]
    },
    update: function(){
        let _this = this

        if(!checkProtectionLockedRangeList([_this.applyRange], Store.currentSheetIndex)){
            return
        }

        if(Store.allowEdit===false){
            return
        }

        let d = editor.deepCopyFlowData(Store.flowdata)
        let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]

        let cfg = $.extend(true, {}, Store.config)
        let borderInfoCompute = getBorderInfoCompute()
        let dataVerification = $.extend(true, {}, file['dataVerification'])

        let direction = _this.direction
        let type = _this.applyType

        //复制范围
        let copyRange = _this.copyRange
        let copy_str_r = copyRange['row'][0], copy_end_r = copyRange['row'][1]
        let copy_str_c = copyRange['column'][0], copy_end_c = copyRange['column'][1]
        let copyData = _this.getCopyData(d, copy_str_r, copy_end_r, copy_str_c, copy_end_c, direction)

        let csLen
        if(direction == 'down' || direction == 'up'){
            csLen = copy_end_r - copy_str_r + 1
        }
        else if(direction == 'right' || direction == 'left'){
            csLen = copy_end_c - copy_str_c + 1
        }

        //应用范围
        let applyRange = _this.applyRange
        let apply_str_r = applyRange['row'][0], apply_end_r = applyRange['row'][1]
        let apply_str_c = applyRange['column'][0], apply_end_c = applyRange['column'][1]

        if(direction == 'down' || direction == 'up'){
            let asLen = apply_end_r - apply_str_r + 1

            for(let i = apply_str_c; i <= apply_end_c; i++){
                let copyD = copyData[i - apply_str_c]

                let applyData = _this.getApplyData(copyD, csLen, asLen)

                if(direction == 'down'){
                    for(let j = apply_str_r; j <= apply_end_r; j++){
                        const index = j - apply_str_r
                        let cell = applyData[index]

                        if(cell.f != null){
                            let f = '=' + formula.functionCopy(cell.f, 'down', (Math.floor(index / csLen) + 1) * csLen)
                            let v = formula.execfunction(f, j, i)

                            formula.execFunctionGroup(j, i, v[1], undefined, d)

                            cell.f = v[2]
                            cell.v = v[1]

                            if(cell.spl != null){
                                cell.spl = v[3].data
                            }
                            else{
                                if(isRealNum(cell.v) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(cell.v)){
                                    if(cell.v == Infinity || cell.v == -Infinity){
                                        cell.m = cell.v.toString()
                                    }
                                    else{
                                        if(cell.v.toString().indexOf('e') > -1){
                                            let len = cell.v.toString().split('.')[1].split('e')[0].length
                                            if(len > 5){
                                                len = 5
                                            }

                                            cell.m = cell.v.toExponential(len).toString()
                                        }
                                        else{
                                            let mask
                                            if(cell.ct.fa === '##0.00'){
                                               /* 如果是数字类型 */
                                               mask = genarate(Math.round(cell.v * 1000000000) / 1000000000 + '.00')
                                               cell.m = mask[0].toString()
                                            }else {
                                                mask = genarate(Math.round(cell.v * 1000000000) / 1000000000)
                                                cell.m = mask[0].toString()
                                            }
                                        }
                                    }

                                    cell.ct = cell.ct || { 'fa': 'General', 't': 'n' }
                                }
                                else{
                                    let mask = genarate(cell.v)
                                    cell.m = mask[0].toString()
                                    cell.ct = mask[1]
                                }
                            }
                        }

                        d[j][i] = cell

                        //边框
                        let bd_r = copy_str_r + index % csLen
                        let bd_c = i

                        if(borderInfoCompute[bd_r + '_' + bd_c]){
                            let bd_obj = {
                                'rangeType': 'cell',
                                'value': {
                                    'row_index': j,
                                    'col_index': i,
                                    'l': borderInfoCompute[bd_r + '_' + bd_c].l,
                                    'r': borderInfoCompute[bd_r + '_' + bd_c].r,
                                    't': borderInfoCompute[bd_r + '_' + bd_c].t,
                                    'b': borderInfoCompute[bd_r + '_' + bd_c].b
                                }
                            }

                            cfg['borderInfo'].push(bd_obj)
                        }
                        else if(borderInfoCompute[j + '_' + i]){
                            let bd_obj = {
                                'rangeType': 'cell',
                                'value': {
                                    'row_index': j,
                                    'col_index': i,
                                    'l': null,
                                    'r': null,
                                    't': null,
                                    'b': null
                                }
                            }

                            cfg['borderInfo'].push(bd_obj)
                        }

                        //数据验证
                        if(dataVerification[bd_r + '_' + bd_c]){
                            dataVerification[j + '_' + i] = dataVerification[bd_r + '_' + bd_c]
                        }
                    }
                }
                if(direction == 'up'){
                    for(let j = apply_end_r; j >= apply_str_r; j--){
                        let cell = applyData[apply_end_r - j]

                        if(cell.f != null){
                            let f = '=' + formula.functionCopy(cell.f, 'up', apply_end_r - j + 1)
                            let v = formula.execfunction(f, j, i)

                            formula.execFunctionGroup(j, i, v[1], undefined, d)

                            cell.f = v[2]
                            cell.v = v[1]

                            if(cell.spl != null){
                                cell.spl = v[3].data
                            }
                            else{
                                if(isRealNum(cell.v) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(cell.v)){
                                    if(cell.v == Infinity || cell.v == -Infinity){
                                        cell.m = cell.v.toString()
                                    }
                                    else{
                                        if(cell.v.toString().indexOf('e') > -1){
                                            let len = cell.v.toString().split('.')[1].split('e')[0].length
                                            if(len > 5){
                                                len = 5
                                            }

                                            cell.m = cell.v.toExponential(len).toString()
                                        }
                                        else{
                                            let mask = genarate(Math.round(cell.v * 1000000000) / 1000000000)
                                            cell.m = mask[0].toString()
                                        }
                                    }

                                    cell.ct = { 'fa': 'General', 't': 'n' }
                                }
                                else{
                                    let mask = genarate(cell.v)
                                    cell.m = mask[0].toString()
                                    cell.ct = mask[1]
                                }
                            }
                        }

                        d[j][i] = cell

                        //边框
                        let bd_r = copy_end_r - (apply_end_r - j) % csLen
                        let bd_c = i

                        if(borderInfoCompute[bd_r + '_' + bd_c]){
                            let bd_obj = {
                                'rangeType': 'cell',
                                'value': {
                                    'row_index': j,
                                    'col_index': i,
                                    'l': borderInfoCompute[bd_r + '_' + bd_c].l,
                                    'r': borderInfoCompute[bd_r + '_' + bd_c].r,
                                    't': borderInfoCompute[bd_r + '_' + bd_c].t,
                                    'b': borderInfoCompute[bd_r + '_' + bd_c].b
                                }
                            }

                            cfg['borderInfo'].push(bd_obj)
                        }
                        else if(borderInfoCompute[j + '_' + i]){
                            let bd_obj = {
                                'rangeType': 'cell',
                                'value': {
                                    'row_index': j,
                                    'col_index': i,
                                    'l': null,
                                    'r': null,
                                    't': null,
                                    'b': null
                                }
                            }

                            cfg['borderInfo'].push(bd_obj)
                        }

                        //数据验证
                        if(dataVerification[bd_r + '_' + bd_c]){
                            dataVerification[j + '_' + i] = dataVerification[bd_r + '_' + bd_c]
                        }
                    }
                }
            }
        }
        else if(direction == 'right' || direction == 'left'){
            let asLen = apply_end_c - apply_str_c + 1

            for(let i = apply_str_r; i <= apply_end_r; i++){
                let copyD = copyData[i - apply_str_r]

                let applyData = _this.getApplyData(copyD, csLen, asLen)

                if(direction == 'right'){
                    for(let j = apply_str_c; j <= apply_end_c; j++){
                        let cell = applyData[j - apply_str_c]

                        if(cell.f != null){
                            let f = '=' + formula.functionCopy(cell.f, 'right', j - apply_str_c + 1)
                            let v = formula.execfunction(f, i, j)

                            formula.execFunctionGroup(i, j, v[1], undefined, d)

                            cell.f = v[2]
                            cell.v = v[1]

                            if(cell.spl != null){
                                cell.spl = v[3].data
                            }
                            else{
                                if(isRealNum(cell.v) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(cell.v)){
                                    if(cell.v == Infinity || cell.v == -Infinity){
                                        cell.m = cell.v.toString()
                                    }
                                    else{
                                        if(cell.v.toString().indexOf('e') > -1){
                                            let len = cell.v.toString().split('.')[1].split('e')[0].length
                                            if(len > 5){
                                                len = 5
                                            }

                                            cell.m = cell.v.toExponential(len).toString()
                                        }
                                        else{
                                            let mask = genarate(Math.round(cell.v * 1000000000) / 1000000000)
                                            cell.m = mask[0].toString()
                                        }
                                    }

                                    cell.ct = { 'fa': 'General', 't': 'n' }
                                }
                                else{
                                    let mask = genarate(cell.v)
                                    cell.m = mask[0].toString()
                                    cell.ct = mask[1]
                                }
                            }
                        }

                        d[i][j] = cell

                        //边框
                        let bd_r = i
                        let bd_c = copy_str_c + (j - apply_str_c) % csLen

                        if(borderInfoCompute[bd_r + '_' + bd_c]){
                            let bd_obj = {
                                'rangeType': 'cell',
                                'value': {
                                    'row_index': i,
                                    'col_index': j,
                                    'l': borderInfoCompute[bd_r + '_' + bd_c].l,
                                    'r': borderInfoCompute[bd_r + '_' + bd_c].r,
                                    't': borderInfoCompute[bd_r + '_' + bd_c].t,
                                    'b': borderInfoCompute[bd_r + '_' + bd_c].b
                                }
                            }

                            cfg['borderInfo'].push(bd_obj)
                        }
                        else if(borderInfoCompute[i + '_' + j]){
                            let bd_obj = {
                                'rangeType': 'cell',
                                'value': {
                                    'row_index': i,
                                    'col_index': j,
                                    'l': null,
                                    'r': null,
                                    't': null,
                                    'b': null
                                }
                            }

                            cfg['borderInfo'].push(bd_obj)
                        }

                        //数据验证
                        if(dataVerification[bd_r + '_' + bd_c]){
                            dataVerification[i + '_' + j] = dataVerification[bd_r + '_' + bd_c]
                        }
                    }
                }
                if(direction == 'left'){
                    for(let j = apply_end_c; j >= apply_str_c; j--){
                        let cell = applyData[apply_end_c - j]

                        if(cell.f != null){
                            let f = '=' + formula.functionCopy(cell.f, 'left', apply_end_c - j + 1)
                            let v = formula.execfunction(f, i, j)

                            formula.execFunctionGroup(i, j, v[1], undefined, d)

                            cell.f = v[2]
                            cell.v = v[1]

                            if(cell.spl != null){
                                cell.spl = v[3].data
                            }
                            else{
                                if(isRealNum(cell.v) && !/^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i.test(cell.v)){
                                    if(cell.v == Infinity || cell.v == -Infinity){
                                        cell.m = cell.v.toString()
                                    }
                                    else{
                                        if(cell.v.toString().indexOf('e') > -1){
                                            let len = cell.v.toString().split('.')[1].split('e')[0].length
                                            if(len > 5){
                                                len = 5
                                            }

                                            cell.m = cell.v.toExponential(len).toString()
                                        }
                                        else{
                                            let mask = genarate(Math.round(cell.v * 1000000000) / 1000000000)
                                            cell.m = mask[0].toString()
                                        }
                                    }

                                    cell.ct = { 'fa': 'General', 't': 'n' }
                                }
                                else{
                                    let mask = genarate(cell.v)
                                    cell.m = mask[0].toString()
                                    cell.ct = mask[1]
                                }
                            }
                        }

                        d[i][j] = cell

                        //边框
                        let bd_r = i
                        let bd_c = copy_end_c - (apply_end_c - j) % csLen

                        if(borderInfoCompute[bd_r + '_' + bd_c]){
                            let bd_obj = {
                                'rangeType': 'cell',
                                'value': {
                                    'row_index': i,
                                    'col_index': j,
                                    'l': borderInfoCompute[bd_r + '_' + bd_c].l,
                                    'r': borderInfoCompute[bd_r + '_' + bd_c].r,
                                    't': borderInfoCompute[bd_r + '_' + bd_c].t,
                                    'b': borderInfoCompute[bd_r + '_' + bd_c].b
                                }
                            }

                            cfg['borderInfo'].push(bd_obj)
                        }
                        else if(borderInfoCompute[i + '_' + j]){
                            let bd_obj = {
                                'rangeType': 'cell',
                                'value': {
                                    'row_index': i,
                                    'col_index': j,
                                    'l': null,
                                    'r': null,
                                    't': null,
                                    'b': null
                                }
                            }

                            cfg['borderInfo'].push(bd_obj)
                        }

                        //数据验证
                        if(dataVerification[bd_r + '_' + bd_c]){
                            dataVerification[i + '_' + j] = dataVerification[bd_r + '_' + bd_c]
                        }
                    }
                }
            }
        }

        //条件格式
        let cdformat = $.extend(true, [], file['luckysheet_conditionformat_save'])
        if(cdformat != null && cdformat.length > 0){
            for(let i = 0; i < cdformat.length; i++){
                let cdformat_cellrange = cdformat[i].cellrange

                let emptyRange = []

                for(let j = 0; j < cdformat_cellrange.length; j++){
                    let range = conditionformat.CFSplitRange(cdformat_cellrange[j], {'row': copyRange['row'], 'column': copyRange['column']}, {'row': applyRange['row'], 'column': applyRange['column']}, 'operatePart')
                    if(range.length > 0){
                        emptyRange = emptyRange.concat(range)
                    }
                }

                if(emptyRange.length > 0){
                    cdformat[i].cellrange.push(applyRange)
                }
            }
        }

        //刷新一次表格
        let allParam = {
            'cfg': cfg,
            'cdformat': cdformat,
            'dataVerification': dataVerification
        }
        jfrefreshgrid(d, Store.luckysheet_select_save, allParam)

        selectHightlightShow()
    },
    getCopyData: function(d, r1, r2, c1, c2, direction){
        let _this = this

        let copyData = []

        let a1, a2, b1, b2
        if(direction == 'down' || direction == 'up'){
            a1 = c1
            a2 = c2
            b1 = r1
            b2 = r2
        }
        else if(direction == 'right' || direction == 'left'){
            a1 = r1
            a2 = r2
            b1 = c1
            b2 = c2
        }

        for(let a = a1; a <= a2; a++){
            let obj = {}

            let arrData = []
            let arrIndex = []
            let text = ''
            let extendNumberBeforeStr = null
            let extendNumberAfterStr = null
            let isSameStr = true

            for(let b = b1; b <= b2; b++){
                //单元格
                let data
                if(direction == 'down' || direction == 'up'){
                    data = d[b][a]
                }
                else if(direction == 'right' || direction == 'left'){
                    data = d[a][b]
                }

                //单元格值类型
                let str
                if(!!data && !!data['v'] && data['f'] == null){
                    if(!!data['ct'] && data['ct']['t'] == 'n'){
                        str = 'number'
                        extendNumberBeforeStr = null
                        extendNumberAfterStr = null
                    }
                    else if(!!data['ct'] && data['ct']['t'] == 'd'){
                        str = 'date'
                        extendNumberBeforeStr = null
                        extendNumberAfterStr = null
                    }
                    else if(_this.isExtendNumber(data['m'])[0]){
                        str = 'extendNumber'

                        let isExtendNumber = _this.isExtendNumber(data['m'])

                        if(extendNumberBeforeStr == null || extendNumberAfterStr == null){
                            isSameStr = true
                            extendNumberBeforeStr = isExtendNumber[2]
                            extendNumberAfterStr = isExtendNumber[3]
                        }
                        else {
                            if(isExtendNumber[2] != extendNumberBeforeStr || isExtendNumber[3] != extendNumberAfterStr){
                                isSameStr = false
                                extendNumberBeforeStr = isExtendNumber[2]
                                extendNumberAfterStr = isExtendNumber[3]
                            }
                            else {
                                isSameStr = true
                            }
                        }
                    }
                    else if(_this.isChnNumber(data['m'])){
                        str = 'chnNumber'
                        extendNumberBeforeStr = null
                        extendNumberAfterStr = null
                    }
                    else if(_this.isChnWeek2(data['m'])){
                        str = 'chnWeek2'
                        extendNumberBeforeStr = null
                        extendNumberAfterStr = null
                    }
                    else if(_this.isChnWeek3(data['m'])){
                        str = 'chnWeek3'
                        extendNumberBeforeStr = null
                        extendNumberAfterStr = null
                    }
                    else{
                        str = 'other'
                        extendNumberBeforeStr = null
                        extendNumberAfterStr = null
                    }
                }
                else{
                    str = 'other'
                    extendNumberBeforeStr = null
                    extendNumberAfterStr = null
                }

                if(str == 'extendNumber'){
                    if(b == b1){
                        if(b1 == b2){
                            text = str
                            arrData.push(data)
                            arrIndex.push(b - b1 + 1)

                            obj[text] = []
                            obj[text].push({'data': arrData, 'index': arrIndex})
                        }
                        else{
                            text = str
                            arrData.push(data)
                            arrIndex.push(b - b1 + 1)
                        }
                    }
                    else if(b == b2){
                        if(text == str && isSameStr){
                            arrData.push(data)
                            arrIndex.push(b - b1 + 1)

                            if(text in obj){
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }
                            else{
                                obj[text] = []
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }
                        }
                        else{
                            if(text in obj){
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }
                            else{
                                obj[text] = []
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }

                            text = str
                            arrData = []
                            arrData.push(data)
                            arrIndex = []
                            arrIndex.push(b - b1 + 1)

                            if(text in obj){
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }
                            else{
                                obj[text] = []
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }
                        }
                    }
                    else{
                        if(text == str && isSameStr){
                            arrData.push(data)
                            arrIndex.push(b - b1 + 1)
                        }
                        else{
                            if(text in obj){
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }
                            else{
                                obj[text] = []
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }

                            text = str
                            arrData = []
                            arrData.push(data)
                            arrIndex = []
                            arrIndex.push(b - b1 + 1)
                        }
                    }
                }
                else{
                    if(b == b1){
                        if(b1 == b2){
                            text = str
                            arrData.push(data)
                            arrIndex.push(b - b1 + 1)

                            obj[text] = []
                            obj[text].push({'data': arrData, 'index': arrIndex})
                        }
                        else{
                            text = str
                            arrData.push(data)
                            arrIndex.push(b - b1 + 1)
                        }
                    }
                    else if(b == b2){
                        if(text == str){
                            arrData.push(data)
                            arrIndex.push(b - b1 + 1)

                            if(text in obj){
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }
                            else{
                                obj[text] = []
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }
                        }
                        else{
                            if(text in obj){
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }
                            else{
                                obj[text] = []
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }

                            text = str
                            arrData = []
                            arrData.push(data)
                            arrIndex = []
                            arrIndex.push(b - b1 + 1)

                            if(text in obj){
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }
                            else{
                                obj[text] = []
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }
                        }
                    }
                    else{
                        if(text == str){
                            arrData.push(data)
                            arrIndex.push(b - b1 + 1)
                        }
                        else{
                            if(text in obj){
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }
                            else{
                                obj[text] = []
                                obj[text].push({'data': arrData, 'index': arrIndex})
                            }

                            text = str
                            arrData = []
                            arrData.push(data)
                            arrIndex = []
                            arrIndex.push(b - b1 + 1)
                        }
                    }
                }
            }

            copyData.push(obj)
        }

        return copyData
    },
    getApplyData: function(copyD, csLen, asLen){
        let _this = this

        let applyData = []

        let direction = _this.direction
        let type = _this.applyType

        let num = Math.floor(asLen / csLen)
        let rsd = asLen % csLen

        //纯数字类型
        let copyD_number = copyD['number']
        let applyD_number = []
        if(copyD_number){
            for(let i = 0; i < copyD_number.length; i++){
                let s = _this.getLenS(copyD_number[i]['index'], rsd)
                let len = copyD_number[i]['index'].length * num + s

                let arrData
                if(type == '1' || type == '3'){
                    arrData = _this.getDataByType(copyD_number[i]['data'], len, direction, type, 'number')
                }
                else if(type == '2'){
                    arrData = _this.getDataByType(copyD_number[i]['data'], len, direction, type)
                }
                else{
                    arrData = _this.getDataByType(copyD_number[i]['data'], len, direction, '0')
                }

                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_number[i]['index'])
                applyD_number.push({'data': arrData, 'index': arrIndex})
            }
        }

        //扩展数字型（即一串字符最后面的是数字）
        let copyD_extendNumber = copyD['extendNumber']
        let applyD_extendNumber = []
        if(copyD_extendNumber){
            for(let i = 0; i < copyD_extendNumber.length; i++){
                let s = _this.getLenS(copyD_extendNumber[i]['index'], rsd)
                let len = copyD_extendNumber[i]['index'].length * num + s

                let arrData
                if(type == '1' || type == '3'){
                    arrData = _this.getDataByType(copyD_extendNumber[i]['data'], len, direction, type, 'extendNumber')
                }
                else if(type == '2'){
                    arrData = _this.getDataByType(copyD_extendNumber[i]['data'], len, direction, type)
                }
                else{
                    arrData = _this.getDataByType(copyD_extendNumber[i]['data'], len, direction, '0')
                }

                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_extendNumber[i]['index'])
                applyD_extendNumber.push({'data': arrData, 'index': arrIndex})
            }
        }

        //日期类型
        let copyD_date = copyD['date']
        let applyD_date = []
        if(copyD_date){
            for(let i = 0; i < copyD_date.length; i++){
                let s = _this.getLenS(copyD_date[i]['index'], rsd)
                let len = copyD_date[i]['index'].length * num + s

                let arrData
                if(type == '1' || type == '3'){
                    arrData = _this.getDataByType(copyD_date[i]['data'], len, direction, type, 'date')
                }
                else if(type == '8'){
                    arrData = _this.getDataByType(copyD_date[i]['data'], len, direction, '0')
                }
                else{
                    arrData = _this.getDataByType(copyD_date[i]['data'], len, direction, type)
                }

                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_date[i]['index'])
                applyD_date.push({'data': arrData, 'index': arrIndex})
            }
        }

        //中文小写数字 或 一~日
        let copyD_chnNumber = copyD['chnNumber']
        let applyD_chnNumber = []
        if(copyD_chnNumber){
            for(let i = 0; i < copyD_chnNumber.length; i++){
                let s = _this.getLenS(copyD_chnNumber[i]['index'], rsd)
                let len = copyD_chnNumber[i]['index'].length * num + s

                let arrData
                if(type == '1' || type == '3'){
                    arrData = _this.getDataByType(copyD_chnNumber[i]['data'], len, direction, type, 'chnNumber')
                }
                else if(type == '2' || type == '8'){
                    arrData = _this.getDataByType(copyD_chnNumber[i]['data'], len, direction, type)
                }
                else{
                    arrData = _this.getDataByType(copyD_chnNumber[i]['data'], len, direction, '0')
                }

                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_chnNumber[i]['index'])
                applyD_chnNumber.push({'data': arrData, 'index': arrIndex})
            }
        }

        //周一~周日
        let copyD_chnWeek2 = copyD['chnWeek2']
        let applyD_chnWeek2 = []
        if(copyD_chnWeek2){
            for(let i = 0; i < copyD_chnWeek2.length; i++){
                let s = _this.getLenS(copyD_chnWeek2[i]['index'], rsd)
                let len = copyD_chnWeek2[i]['index'].length * num + s

                let arrData
                if(type == '1' || type == '3'){
                    arrData = _this.getDataByType(copyD_chnWeek2[i]['data'], len, direction, type, 'chnWeek2')
                }
                else if(type == '2'){
                    arrData = _this.getDataByType(copyD_chnWeek2[i]['data'], len, direction, type)
                }
                else{
                    arrData = _this.getDataByType(copyD_chnWeek2[i]['data'], len, direction, '0')
                }

                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_chnWeek2[i]['index'])
                applyD_chnWeek2.push({'data': arrData, 'index': arrIndex})
            }
        }

        //星期一~星期日
        let copyD_chnWeek3 = copyD['chnWeek3']
        let applyD_chnWeek3 = []
        if(copyD_chnWeek3){
            for(let i = 0; i < copyD_chnWeek3.length; i++){
                let s = _this.getLenS(copyD_chnWeek3[i]['index'], rsd)
                let len = copyD_chnWeek3[i]['index'].length * num + s

                let arrData
                if(type == '1' || type == '3'){
                    arrData = _this.getDataByType(copyD_chnWeek3[i]['data'], len, direction, type, 'chnWeek3')
                }
                else if(type == '2'){
                    arrData = _this.getDataByType(copyD_chnWeek3[i]['data'], len, direction, type)
                }
                else{
                    arrData = _this.getDataByType(copyD_chnWeek3[i]['data'], len, direction, '0')
                }

                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_chnWeek3[i]['index'])
                applyD_chnWeek3.push({'data': arrData, 'index': arrIndex})
            }
        }

        //其它
        let copyD_other = copyD['other']
        let applyD_other = []
        if(copyD_other){
            for(let i = 0; i < copyD_other.length; i++){
                let s = _this.getLenS(copyD_other[i]['index'], rsd)
                let len = copyD_other[i]['index'].length * num + s

                let arrData
                if(type == '2' || type == '3'){
                    arrData = _this.getDataByType(copyD_other[i]['data'], len, direction, type)
                }
                else{
                    arrData = _this.getDataByType(copyD_other[i]['data'], len, direction, '0')
                }

                let arrIndex = _this.getDataIndex(csLen, asLen, copyD_other[i]['index'])
                applyD_other.push({'data': arrData, 'index': arrIndex})
            }
        }

        for(let x = 1; x <= asLen; x++){
            if(applyD_number.length > 0){
                for(let y = 0; y < applyD_number.length; y++){
                    if(x in applyD_number[y]['index']){
                        applyData.push(applyD_number[y]['data'][applyD_number[y]['index'][x]])
                    }
                }
            }

            if(applyD_extendNumber.length > 0){
                for(let y = 0; y < applyD_extendNumber.length; y++){
                    if(x in applyD_extendNumber[y]['index']){
                        applyData.push(applyD_extendNumber[y]['data'][applyD_extendNumber[y]['index'][x]])
                    }
                }
            }

            if(applyD_date.length > 0){
                for(let y = 0; y < applyD_date.length; y++){
                    if(x in applyD_date[y]['index']){
                        applyData.push(applyD_date[y]['data'][applyD_date[y]['index'][x]])
                    }
                }
            }

            if(applyD_chnNumber.length > 0){
                for(let y = 0; y < applyD_chnNumber.length; y++){
                    if(x in applyD_chnNumber[y]['index']){
                        applyData.push(applyD_chnNumber[y]['data'][applyD_chnNumber[y]['index'][x]])
                    }
                }
            }

            if(applyD_chnWeek2.length > 0){
                for(let y = 0; y < applyD_chnWeek2.length; y++){
                    if(x in applyD_chnWeek2[y]['index']){
                        applyData.push(applyD_chnWeek2[y]['data'][applyD_chnWeek2[y]['index'][x]])
                    }
                }
            }

            if(applyD_chnWeek3.length > 0){
                for(let y = 0; y < applyD_chnWeek3.length; y++){
                    if(x in applyD_chnWeek3[y]['index']){
                        applyData.push(applyD_chnWeek3[y]['data'][applyD_chnWeek3[y]['index'][x]])
                    }
                }
            }

            if(applyD_other.length > 0){
                for(let y = 0; y < applyD_other.length; y++){
                    if(x in applyD_other[y]['index']){
                        applyData.push(applyD_other[y]['data'][applyD_other[y]['index'][x]])
                    }
                }
            }
        }

        return applyData
    },
    getLenS: function(indexArr, rsd){
        let s = 0

        for(let j = 0; j < indexArr.length; j++){
            if(indexArr[j] <= rsd){
                s++
            }
            else{
                break
            }
        }

        return s
    },
    getDataIndex: function(csLen, asLen, indexArr){
        let obj = {}

        let num = Math.floor(asLen / csLen)
        let rsd = asLen % csLen

        let sum = 0
        if(num > 0){
            for(let i = 1; i <= num; i++){
                for(let j = 0; j < indexArr.length; j++){
                    obj[indexArr[j] + (i - 1) * csLen] = sum
                    sum++
                }
            }
            for(let a = 0; a < indexArr.length; a++){
                if(indexArr[a] <= rsd){
                    obj[indexArr[a] + csLen * num] = sum
                    sum++
                }
                else{
                    break
                }
            }
        }
        else{
            for(let a = 0; a < indexArr.length; a++){
                if(indexArr[a] <= rsd){
                    obj[indexArr[a]] = sum
                    sum++
                }
                else{
                    break
                }
            }
        }

        return obj
    },
    getDataByType: function(data, len, direction, type ,dataType){
        let _this = this

        let applyData = []

        if(type == '0'){ //复制单元格
            if(direction == 'up' || direction == 'left'){
                data.reverse()
            }

            applyData = _this.FillCopy(data, len)
        }
        else if(type == '1'){ //填充序列
            if(dataType == 'number'){
                //数据类型是 数字
                applyData = _this.FillSeries(data, len, direction)
            }
            else if(dataType == 'extendNumber'){
                //扩展数字
                if(data.length == 1){
                    let step
                    if(direction == 'down' || direction == 'right'){
                        step = 1
                    }
                    else if(direction == 'up' || direction == 'left'){
                        step = -1
                    }

                    applyData = _this.FillExtendNumber(data, len, step)
                }
                else{
                    let dataNumArr = []

                    for(let i = 0; i < data.length; i++){
                        let txt = data[i]['m']
                        dataNumArr.push(Number(_this.isExtendNumber(txt)[1]))
                    }

                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                        dataNumArr.reverse()
                    }

                    if(_this.isEqualDiff(dataNumArr)){
                        //等差数列，以等差为step
                        let step = dataNumArr[1] - dataNumArr[0]
                        applyData = _this.FillExtendNumber(data, len, step)
                    }
                    else{
                        //不是等差数列，复制数据
                        applyData = _this.FillCopy(data, len)
                    }
                }
            }
            else if(dataType == 'date'){
                //数据类型是 日期
                if(data.length == 1){
                    //以一天为step
                    let step
                    if(direction == 'down' || direction == 'right'){
                        step = 1
                    }
                    else if(direction == 'up' || direction == 'left'){
                        step = -1
                    }

                    applyData = _this.FillDays(data, len, step)
                }
                else{
                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                    }

                    let judgeDate = _this.judgeDate(data)
                    if(judgeDate[0] && judgeDate[3]){
                        //日一样，月差为等差数列，以月差为step
                        let step = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'months')
                        applyData = _this.FillMonths(data, len, step)
                    }
                    else if(!judgeDate[0] && judgeDate[2]){
                        //日不一样，日差为等差数列，以日差为step
                        let step = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'days')
                        applyData = _this.FillDays(data, len, step)
                    }
                    else{
                        //其它，复制数据
                        applyData = _this.FillCopy(data, len)
                    }
                }
            }
            else if(dataType == 'chnNumber'){
                //数据类型是 中文小写数字
                if(data.length == 1){
                    if(data[0]['m'] == '日' || _this.ChineseToNumber(data[0]['m']) < 7){
                        //数字小于7，以周一~周日序列填充
                        let step
                        if(direction == 'down' || direction == 'right'){
                            step = 1
                        }
                        else if(direction == 'up' || direction == 'left'){
                            step = -1
                        }

                        applyData = _this.FillChnWeek(data, len, step)
                    }
                    else{
                        //数字大于7，以中文小写数字序列填充
                        let step
                        if(direction == 'down' || direction == 'right'){
                            step = 1
                        }
                        else if(direction == 'up' || direction == 'left'){
                            step = -1
                        }

                        applyData = _this.FillChnNumber(data, len, step)
                    }
                }
                else{
                    let hasweek = false
                    for(let i = 0; i < data.length; i++){
                        if(data[i]['m'] == '日'){
                            hasweek = true
                            break
                        }
                    }

                    let dataNumArr = []
                    let weekIndex = 0
                    for(let i = 0; i < data.length; i++){
                        if(data[i]['m'] == '日'){
                            if(i == 0){
                                dataNumArr.push(0)
                            }
                            else{
                                weekIndex++
                                dataNumArr.push(weekIndex * 7)
                            }
                        }
                        else if(hasweek && _this.ChineseToNumber(data[i]['m']) > 0 && _this.ChineseToNumber(data[i]['m']) < 7){
                            dataNumArr.push(_this.ChineseToNumber(data[i]['m']) + weekIndex * 7)
                        }
                        else{
                            dataNumArr.push(_this.ChineseToNumber(data[i]['m']))
                        }
                    }

                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                        dataNumArr.reverse()
                    }

                    if(_this.isEqualDiff(dataNumArr)){
                        if(hasweek || (dataNumArr[dataNumArr.length - 1] < 6 && dataNumArr[0] > 0) || (dataNumArr[0] < 6 && dataNumArr[dataNumArr.length - 1] > 0)){
                            //以周一~周日序列填充
                            let step = dataNumArr[1] - dataNumArr[0]
                            applyData = _this.FillChnWeek(data, len, step)
                        }
                        else{
                            //以中文小写数字序列填充
                            let step = dataNumArr[1] - dataNumArr[0]
                            applyData = _this.FillChnNumber(data, len, step)
                        }
                    }
                    else{
                        //不是等差数列，复制数据
                        applyData = _this.FillCopy(data, len)
                    }
                }
            }
            else if(dataType == 'chnWeek2'){
                //周一~周日
                if(data.length == 1){
                    let step
                    if(direction == 'down' || direction == 'right'){
                        step = 1
                    }
                    else if(direction == 'up' || direction == 'left'){
                        step = -1
                    }

                    applyData = _this.FillChnWeek2(data, len, step)
                }
                else{
                    let dataNumArr = []
                    let weekIndex = 0

                    for(let i = 0; i < data.length; i++){
                        let lastTxt = data[i]['m'].substr(data[i]['m'].length - 1, 1)
                        if(data[i]['m'] == '周日'){
                            if(i == 0){
                                dataNumArr.push(0)
                            }
                            else{
                                weekIndex++
                                dataNumArr.push(weekIndex * 7)
                            }
                        }
                        else{
                            dataNumArr.push(_this.ChineseToNumber(lastTxt) + weekIndex * 7)
                        }
                    }

                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                        dataNumArr.reverse()
                    }

                    if(_this.isEqualDiff(dataNumArr)){
                        //等差数列，以等差为step
                        let step = dataNumArr[1] - dataNumArr[0]
                        applyData = _this.FillChnWeek2(data, len, step)
                    }
                    else{
                        //不是等差数列，复制数据
                        applyData = _this.FillCopy(data, len)
                    }
                }
            }
            else if(dataType == 'chnWeek3'){
                //星期一~星期日
                if(data.length == 1){
                    let step
                    if(direction == 'down' || direction == 'right'){
                        step = 1
                    }
                    else if(direction == 'up' || direction == 'left'){
                        step = -1
                    }

                    applyData = _this.FillChnWeek3(data, len, step)
                }
                else{
                    let dataNumArr = []
                    let weekIndex = 0

                    for(let i = 0; i < data.length; i++){
                        let lastTxt = data[i]['m'].substr(data[i]['m'].length - 1, 1)
                        if(data[i]['m'] == '星期日'){
                            if(i == 0){
                                dataNumArr.push(0)
                            }
                            else{
                                weekIndex++
                                dataNumArr.push(weekIndex * 7)
                            }
                        }
                        else{
                            dataNumArr.push(_this.ChineseToNumber(lastTxt) + weekIndex * 7)
                        }
                    }

                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                        dataNumArr.reverse()
                    }

                    if(_this.isEqualDiff(dataNumArr)){
                        //等差数列，以等差为step
                        let step = dataNumArr[1] - dataNumArr[0]
                        applyData = _this.FillChnWeek3(data, len, step)
                    }
                    else{
                        //不是等差数列，复制数据
                        applyData = _this.FillCopy(data, len)
                    }
                }
            }
            else{
                //数据类型是 其它
                if(direction == 'up' || direction == 'left'){
                    data.reverse()
                }

                applyData = _this.FillCopy(data, len)
            }
        }
        else if(type == '2'){ //仅填充格式
            if(direction == 'up' || direction == 'left'){
                data.reverse()
            }

            applyData = _this.FillOnlyFormat(data, len)
        }
        else if(type == '3'){ //不带格式填充
            let dataArr = _this.getDataByType(data, len, direction, '1' ,dataType)
            applyData = _this.FillWithoutFormat(dataArr)
        }
        else if(type == '4'){ //以天数填充
            if(data.length == 1){
                //以一天为step
                let step
                if(direction == 'down' || direction == 'right'){
                    step = 1
                }
                else if(direction == 'up' || direction == 'left'){
                    step = -1
                }

                applyData = _this.FillDays(data, len, step)
            }
            else if(data.length == 2){
                //以日差为step
                if(direction == 'up' || direction == 'left'){
                    data.reverse()
                }

                let step = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'days')
                applyData = _this.FillDays(data, len, step)
            }
            else{
                if(direction == 'up' || direction == 'left'){
                    data.reverse()
                }

                let judgeDate = _this.judgeDate(data)
                if(judgeDate[0] && judgeDate[3]){
                    //日一样，且月差为等差数列，以月差为step
                    let step = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'months')
                    applyData = _this.FillMonths(data, len, step)
                }
                else if(!judgeDate[0] && judgeDate[2]){
                    //日不一样，且日差为等差数列，以日差为step
                    let step = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'days')
                    applyData = _this.FillDays(data, len, step)
                }
                else{
                    //日差不是等差数列，复制数据
                    applyData = _this.FillCopy(data, len)
                }
            }
        }
        else if(type == '5'){ //以工作日填充
            if(data.length == 1){
                //以一天为step（若那天为休息日，则跳过）
                let step
                if(direction == 'down' || direction == 'right'){
                    step = 1
                }
                else if(direction == 'up' || direction == 'left'){
                    step = -1
                }

                let newLen = Math.round(len * 1.5)
                for(let i = 1; i <= newLen; i++){
                    let d = $.extend(true, {}, data[0])

                    let day = dayjs(d['m']).add(i, 'days').day()
                    if(day == 0 || day == 6){
                        continue
                    }

                    let date = dayjs(d['m']).add(step * i, 'days').format('YYYY-MM-DD')
                    d['m'] = date
                    d['v'] = genarate(date)[2]
                    applyData.push(d)

                    if(applyData.length == len){
                        break
                    }
                }
            }
            else if(data.length == 2){
                if(dayjs(data[1]['m']).date() == dayjs(data[0]['m']).date() && dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'months') != 0){
                    //日一样，且月差大于一月，以月差为step（若那天为休息日，则向前取最近的工作日）
                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                    }

                    let step = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'months')

                    for(let i = 1; i <= len; i++){
                        let index = (i - 1) % data.length
                        let d = $.extend(true, {}, data[index])

                        let day = dayjs(data[data.length - 1]).add(step * i, 'months').day(),
                            date
                        if(day == 0){
                            date = dayjs(data[data.length - 1]).add(step * i, 'months').subtract(2, 'days').format('YYYY-MM-DD')
                        }
                        else if(day == 6){
                            date = dayjs(data[data.length - 1]).add(step * i, 'months').subtract(1, 'days').format('YYYY-MM-DD')
                        }
                        else{
                            date = dayjs(data[data.length - 1]).add(step * i, 'months').format('YYYY-MM-DD')
                        }

                        d['m'] = date
                        d['v'] = genarate(date)[2]
                        applyData.push(d)
                    }
                }
                else{
                    //日不一样
                    if(Math.abs(dayjs(data[1]['m']).diff(dayjs(data[0]['m']))) > 7){
                        //若日差大于7天，以一月为step（若那天是休息日，则向前取最近的工作日）
                        let step_month
                        if(direction == 'down' || direction == 'right'){
                            step_month = 1
                        }
                        else if(direction == 'up' || direction == 'left'){
                            step_month = -1
                            data.reverse()
                        }

                        let step //以数组第一个为对比
                        for(let i = 1; i <= len; i++){
                            let index = (i - 1) % data.length
                            let d = $.extend(true, {}, data[index])

                            let num = Math.ceil(i / data.length)
                            if(index == 0){
                                step = dayjs(d['m']).add(step_month * num, 'months').diff(dayjs(d['m']), 'days')
                            }

                            let day = dayjs(d['m']).add(step, 'days').day(),
                                date
                            if(day == 0){
                                date = dayjs(d['m']).add(step, 'days').subtract(2, 'days').format('YYYY-MM-DD')
                            }
                            else if(day == 6){
                                date = dayjs(d['m']).add(step, 'days').subtract(1, 'days').format('YYYY-MM-DD')
                            }
                            else{
                                date = dayjs(d['m']).add(step, 'days').format('YYYY-MM-DD')
                            }

                            d['m'] = date
                            d['v'] = genarate(date)[2]
                            applyData.push(d)
                        }
                    }
                    else{
                        //若日差小于等于7天，以7天为step（若那天是休息日，则向前取最近的工作日）
                        let step_day
                        if(direction == 'down' || direction == 'right'){
                            step_day = 7
                        }
                        else if(direction == 'up' || direction == 'left'){
                            step_day = -7
                            data.reverse()
                        }

                        let step //以数组第一个为对比
                        for(let i = 1; i <= len; i++){
                            let index = (i - 1) % data.length
                            let d = $.extend(true, {}, data[index])

                            let num = Math.ceil(i / data.length)
                            if(index == 0){
                                step = dayjs(d['m']).add(step_day * num, 'days').diff(dayjs(d['m']), 'days')
                            }

                            let day = dayjs(d['m']).add(step, 'days').day(),
                                date
                            if(day == 0){
                                date = dayjs(d['m']).add(step, 'days').subtract(2, 'days').format('YYYY-MM-DD')
                            }
                            else if(day == 6){
                                date = dayjs(d['m']).add(step, 'days').subtract(1, 'days').format('YYYY-MM-DD')
                            }
                            else{
                                date = dayjs(d['m']).add(step, 'days').format('YYYY-MM-DD')
                            }

                            d['m'] = date
                            d['v'] = genarate(date)[2]
                            applyData.push(d)
                        }
                    }
                }
            }
            else{
                let judgeDate = _this.judgeDate(data)
                if(judgeDate[0] && judgeDate[3]){
                    //日一样，且月差为等差数列，以月差为step（若那天为休息日，则向前取最近的工作日）
                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                    }

                    let step = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'months')

                    for(let i = 1; i <= len; i++){
                        let index = (i - 1) % data.length
                        let d = $.extend(true, {}, data[index])

                        let day = dayjs(data[data.length - 1]['m']).add(step * i, 'months').day(),
                            date
                        if(day == 0){
                            date = dayjs(data[data.length - 1]['m']).add(step * i, 'months').subtract(2, 'days').format('YYYY-MM-DD')
                        }
                        else if(day == 6){
                            date = dayjs(data[data.length - 1]['m']).add(step * i, 'months').subtract(1, 'days').format('YYYY-MM-DD')
                        }
                        else{
                            date = dayjs(data[data.length - 1]['m']).add(step * i, 'months').format('YYYY-MM-DD')
                        }

                        d['m'] = date
                        d['v'] = genarate(date)[2]
                        applyData.push(d)
                    }
                }
                else if(!judgeDate[0] && judgeDate[2]){
                    //日不一样，且日差为等差数列
                    if(Math.abs(dayjs(data[1]['m']).diff(dayjs(data[0]['m']))) > 7){
                        //若日差大于7天，以一月为step（若那天是休息日，则向前取最近的工作日）
                        let step_month
                        if(direction == 'down' || direction == 'right'){
                            step_month = 1
                        }
                        else if(direction == 'up' || direction == 'left'){
                            step_month = -1
                            data.reverse()
                        }

                        let step //以数组第一个为对比
                        for(let i = 1; i <= len; i++){
                            let index = (i - 1) % data.length
                            let d = $.extend(true, {}, data[index])

                            let num = Math.ceil(i / data.length)
                            if(index == 0){
                                step = dayjs(d['m']).add(step_month * num, 'months').diff(dayjs(d['m']), 'days')
                            }

                            let day = dayjs(d['m']).add(step, 'days').day(),
                                date
                            if(day == 0){
                                date = dayjs(d['m']).add(step, 'days').subtract(2, 'days').format('YYYY-MM-DD')
                            }
                            else if(day == 6){
                                date = dayjs(d['m']).add(step, 'days').subtract(1, 'days').format('YYYY-MM-DD')
                            }
                            else{
                                date = dayjs(d['m']).add(step, 'days').format('YYYY-MM-DD')
                            }

                            d['m'] = date
                            d['v'] = genarate(date)[2]
                            applyData.push(d)
                        }
                    }
                    else{
                        //若日差小于等于7天，以7天为step（若那天是休息日，则向前取最近的工作日）
                        let step_day
                        if(direction == 'down' || direction == 'right'){
                            step_day = 7
                        }
                        else if(direction == 'up' || direction == 'left'){
                            step_day = -7
                            data.reverse()
                        }

                        let step //以数组第一个为对比
                        for(let i = 1; i <= len; i++){
                            let index = (i - 1) % data.length
                            let d = $.extend(true, {}, data[index])

                            let num = Math.ceil(i / data.length)
                            if(index == 0){
                                step = dayjs(d['m']).add(step_day * num, 'days').diff(dayjs(d['m']), 'days')
                            }

                            let day = dayjs(d['m']).add(step, 'days').day(),
                                date
                            if(day == 0){
                                date = dayjs(d['m']).add(step, 'days').subtract(2, 'days').format('YYYY-MM-DD')
                            }
                            else if(day == 6){
                                date = dayjs(d['m']).add(step, 'days').subtract(1, 'days').format('YYYY-MM-DD')
                            }
                            else{
                                date = dayjs(d['m']).add(step, 'days').format('YYYY-MM-DD')
                            }

                            d['m'] = date
                            d['v'] = genarate(date)[2]
                            applyData.push(d)
                        }
                    }
                }
                else{
                    //日差不是等差数列，复制数据
                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                    }

                    applyData = _this.FillCopy(data, len)
                }
            }
        }
        else if(type == '6'){ //以月填充
            if(data.length == 1){
                //以一月为step
                let step
                if(direction == 'down' || direction == 'right'){
                    step = 1
                }
                else if(direction == 'up' || direction == 'left'){
                    step = -1
                }

                applyData = _this.FillMonths(data, len, step)
            }
            else if(data.length == 2){
                if(dayjs(data[1]['m']).date() == dayjs(data[0]['m']).date() && dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'months') != 0){
                    //日一样，且月差大于一月，以月差为step
                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                    }

                    let step = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'months')
                    applyData = _this.FillMonths(data, len, step)
                }
                else{
                    //以一月为step
                    let step_month
                    if(direction == 'down' || direction == 'right'){
                        step_month = 1
                    }
                    else if(direction == 'up' || direction == 'left'){
                        step_month = -1
                        data.reverse()
                    }

                    let step //以数组第一个为对比
                    for(let i = 1; i <= len; i++){
                        let index = (i - 1) % data.length
                        let d = $.extend(true, {}, data[index])

                        let num = Math.ceil(i / data.length)
                        if(index == 0){
                            step = dayjs(d['m']).add(step_month * num, 'months').diff(dayjs(d['m']), 'days')
                        }

                        let date = dayjs(d['m']).add(step, 'days').format('YYYY-MM-DD')
                        d['m'] = date
                        d['v'] = genarate(date)[2]
                        applyData.push(d)
                    }
                }
            }
            else{
                let judgeDate = _this.judgeDate(data)
                if(judgeDate[0] && judgeDate[3]){
                    //日一样，且月差为等差数列，以月差为step
                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                    }

                    let step = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'months')
                    applyData = _this.FillMonths(data, len, step)
                }
                else if(!judgeDate[0] && judgeDate[2]){
                    //日不一样，且日差为等差数列，以一月为step
                    let step_month
                    if(direction == 'down' || direction == 'right'){
                        step_month = 1
                    }
                    else if(direction == 'up' || direction == 'left'){
                        step_month = -1
                        data.reverse()
                    }

                    let step //以数组第一个为对比
                    for(let i = 1; i <= len; i++){
                        let index = (i - 1) % data.length
                        let d = $.extend(true, {}, data[index])

                        let num = Math.ceil(i / data.length)
                        if(index == 0){
                            step = dayjs(d['m']).add(step_month * num, 'months').diff(dayjs(d['m']), 'days')
                        }

                        let date = dayjs(d['m']).add(step, 'days').format('YYYY-MM-DD')
                        d['m'] = date
                        d['v'] = genarate(date)[2]
                        applyData.push(d)
                    }
                }
                else{
                    //日差不是等差数列，复制数据
                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                    }

                    applyData = _this.FillCopy(data, len)
                }
            }
        }
        else if(type == '7'){ //以年填充
            if(data.length == 1){
                //以一年为step
                let step
                if(direction == 'down' || direction == 'right'){
                    step = 1
                }
                else if(direction == 'up' || direction == 'left'){
                    step = -1
                }

                applyData = _this.FillYears(data, len, step)
            }
            else if(data.length == 2){
                if(dayjs(data[1]['m']).date() == dayjs(data[0]['m']).date() && dayjs(data[1]['m']).month() == dayjs(data[0]['m']).month() && dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'years') != 0){
                    //日月一样，且年差大于一年，以年差为step
                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                    }

                    let step = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'years')
                    applyData = _this.FillYears(data, len, step)
                }
                else{
                    //以一年为step
                    let step_year
                    if(direction == 'down' || direction == 'right'){
                        step_year = 1
                    }
                    else if(direction == 'up' || direction == 'left'){
                        step_year = -1
                        data.reverse()
                    }

                    let step //以数组第一个为对比
                    for(let i = 1; i <= len; i++){
                        let index = (i - 1) % data.length
                        let d = $.extend(true, {}, data[index])

                        let num = Math.ceil(i / data.length)
                        if(index == 0){
                            step = dayjs(d['m']).add(step_year * num, 'years').diff(dayjs(d['m']), 'days')
                        }

                        let date = dayjs(d['m']).add(step, 'days').format('YYYY-MM-DD')
                        d['m'] = date
                        d['v'] = genarate(date)[2]
                        applyData.push(d)
                    }
                }
            }
            else{
                let judgeDate = _this.judgeDate(data)
                if(judgeDate[0] && judgeDate[1] && judgeDate[4]){
                    //日月一样，且年差为等差数列，以年差为step
                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                    }

                    let step = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'years')
                    applyData = _this.FillYears(data, len, step)
                }
                else if((judgeDate[0] && judgeDate[3]) || judgeDate[2]){
                    //日一样且月差为等差数列，或天差为等差数列，以一年为step
                    let step_year
                    if(direction == 'down' || direction == 'right'){
                        step_year = 1
                    }
                    else if(direction == 'up' || direction == 'left'){
                        step_year = -1
                        data.reverse()
                    }

                    let step //以数组第一个为对比
                    for(let i = 1; i <= len; i++){
                        let index = (i - 1) % data.length
                        let d = $.extend(true, {}, data[index])

                        let num = Math.ceil(i / data.length)
                        if(index == 0){
                            step = dayjs(d['m']).add(step_year * num, 'years').diff(dayjs(d['m']), 'days')
                        }

                        let date = dayjs(d['m']).add(step, 'days').format('YYYY-MM-DD')
                        d['m'] = date
                        d['v'] = genarate(date)[2]
                        applyData.push(d)
                    }
                }
                else{
                    //日差不是等差数列，复制数据
                    if(direction == 'up' || direction == 'left'){
                        data.reverse()
                    }

                    applyData = _this.FillCopy(data, len)
                }
            }
        }
        else if(type == '8'){ //以中文小写数字序列填充
            if(data.length == 1){
                let step
                if(direction == 'down' || direction == 'right'){
                    step = 1
                }
                else if(direction == 'up' || direction == 'left'){
                    step = -1
                }

                applyData = _this.FillChnNumber(data, len, step)
            }
            else{
                let dataNumArr = []
                for(let i = 0; i < data.length; i++){
                    dataNumArr.push(_this.ChineseToNumber(data[i]['m']))
                }

                if(direction == 'up' || direction == 'left'){
                    data.reverse()
                    dataNumArr.reverse()
                }

                if(_this.isEqualDiff(dataNumArr)){
                    let step = dataNumArr[1] - dataNumArr[0]
                    applyData = _this.FillChnNumber(data, len, step)
                }
                else{
                    //不是等差数列，复制数据
                    applyData = _this.FillCopy(data, len)
                }
            }
        }

        return applyData
    },
    FillCopy: function(data, len){
        let applyData = []

        for(let i = 1; i <= len; i++){
            let index = (i - 1) % data.length
            let d = $.extend(true, {}, data[index])

            applyData.push(d)
        }

        return applyData
    },
    FillSeries: function(data, len, direction){
        let _this = this

        let applyData = []

        let dataNumArr = []
        for(let j = 0; j < data.length; j++){
            dataNumArr.push(Number(data[j]['v']))
        }

        if(data.length > 2 && _this.isEqualRatio(dataNumArr)){
            //等比数列
            for(let i = 1; i <= len; i++){
                let index = (i - 1) % data.length
                let d = $.extend(true, {}, data[index])

                let num
                if(direction == 'down' || direction == 'right'){
                    num = Number(data[data.length -1]['v']) * Math.pow(Number(data[1]['v']) / Number(data[0]['v']), i)
                }
                else if(direction == 'up' || direction == 'left'){
                    num = Number(data[0]['v']) / Math.pow(Number(data[1]['v']) / Number(data[0]['v']), i)
                }

                d['v'] = num
                d['m'] = update(d['ct']['fa'], num)
                applyData.push(d)
            }
        }
        else{
            //线性数列
            let xArr = _this.getXArr(data.length)
            for(let i = 1; i <= len; i++){
                let index = (i - 1) % data.length
                let d = $.extend(true, {}, data[index])

                let y
                if(direction == 'down' || direction == 'right'){
                    y = _this.forecast(data.length + i, dataNumArr, xArr)
                }
                else if(direction == 'up' || direction == 'left'){
                    y = _this.forecast(1 - i, dataNumArr, xArr)
                }

                d['v'] = y
                d['m'] = update(d['ct']['fa'], y)
                applyData.push(d)
            }
        }

        return applyData
    },
    FillExtendNumber: function(data, len, step){
        let _this = this

        let applyData = []
        let reg = /0|([1-9]+[0-9]*)/g

        for(let i = 1; i <= len; i++){
            let index = (i - 1) % data.length
            let d = $.extend(true, {}, data[index])

            let last = data[data.length - 1]['m']
            let match = last.match(reg)
            let lastTxt = match[match.length -1]

            let num = Math.abs(Number(lastTxt) + step * i)
            let lastIndex = last.lastIndexOf(lastTxt)
            let valueTxt = last.substr(0, lastIndex) + num.toString() + last.substr(lastIndex + lastTxt.length)

            d['v'] = valueTxt
            d['m'] = valueTxt

            applyData.push(d)
        }

        return applyData
    },
    FillOnlyFormat: function(data, len){
        let applyData = []

        for(let i = 1; i <= len; i++){
            let index = (i - 1) % data.length
            let d = $.extend(true, {}, data[index])

            delete d['f']
            delete d['m']
            delete d['v']

            applyData.push(d)
        }

        return applyData
    },
    FillWithoutFormat: function(dataArr){
        let applyData = []

        for(let i = 0; i < dataArr.length; i++){
            let d = $.extend(true, {}, dataArr[i])

            let obj
            if(d['f'] == null){
                obj = {'m': d['v'].toString(), 'v': d['v']}
            }
            else{
                obj = {'f': d['f'], 'm': d['v'].toString(), 'v': d['v']}
            }

            applyData.push(obj)
        }

        return applyData
    },
    FillDays: function(data, len, step){
        let applyData = []

        for(let i = 1; i <= len; i++){
            let index = (i - 1) % data.length
            let d = $.extend(true, {}, data[index])

            let date = update('yyyy-MM-dd', d['v'])
            date = dayjs(date).add(step * i, 'days').format('YYYY-MM-DD')

            d['v'] = genarate(date)[2]
            d['m'] = update(d['ct']['fa'], d['v'])

            applyData.push(d)
        }

        return applyData
    },
    FillMonths: function(data, len, step){
        let applyData = []

        for(let i = 1; i <= len; i++){
            let index = (i - 1) % data.length
            let d = $.extend(true, {}, data[index])

            let date = update('yyyy-MM-dd', d['v'])
            date = dayjs(date).add(step * i, 'months').format('YYYY-MM-DD')

            d['v'] = genarate(date)[2]
            d['m'] = update(d['ct']['fa'], d['v'])

            applyData.push(d)
        }

        return applyData
    },
    FillYears: function(data, len, step){
        let applyData = []

        for(let i = 1; i <= len; i++){
            let index = (i - 1) % data.length
            let d = $.extend(true, {}, data[index])

            let date = update('yyyy-MM-dd', d['v'])
            date = dayjs(date).add(step * i, 'years').format('YYYY-MM-DD')

            d['v'] = genarate(date)[2]
            d['m'] = update(d['ct']['fa'], d['v'])

            applyData.push(d)
        }

        return applyData
    },
    FillChnWeek: function(data, len, step){
        let _this = this

        let applyData = []

        for(let i = 1; i <= len; i++){
            let index = (i - 1) % data.length
            let d = $.extend(true, {}, data[index])

            let num
            if(data[data.length - 1]['m'] == '日'){
                num = 7 + step * i
            }
            else{
                num = _this.ChineseToNumber(data[data.length - 1]['m']) + step * i
            }

            if(num < 0){
                num = Math.ceil(Math.abs(num) / 7) * 7 + num
            }

            let rsd = num % 7
            if(rsd == 0){
                d['m'] = '日'
                d['v'] = '日'
            }
            else if(rsd == 1){
                d['m'] = '一'
                d['v'] = '一'
            }
            else if(rsd == 2){
                d['m'] = '二'
                d['v'] = '二'
            }
            else if(rsd == 3){
                d['m'] = '三'
                d['v'] = '三'
            }
            else if(rsd == 4){
                d['m'] = '四'
                d['v'] = '四'
            }
            else if(rsd == 5){
                d['m'] = '五'
                d['v'] = '五'
            }
            else if(rsd == 6){
                d['m'] = '六'
                d['v'] = '六'
            }

            applyData.push(d)
        }

        return applyData
    },
    FillChnWeek2: function(data, len, step){
        let _this = this

        let applyData = []

        for(let i = 1; i <= len; i++){
            let index = (i - 1) % data.length
            let d = $.extend(true, {}, data[index])

            let num
            if(data[data.length - 1]['m'] == '周日'){
                num = 7 + step * i
            }
            else{
                let last = data[data.length - 1]['m']
                let txt = last.substr(last.length - 1, 1)
                num = _this.ChineseToNumber(txt) + step * i
            }

            if(num < 0){
                num = Math.ceil(Math.abs(num) / 7) * 7 + num
            }

            let rsd = num % 7
            if(rsd == 0){
                d['m'] = '周日'
                d['v'] = '周日'
            }
            else if(rsd == 1){
                d['m'] = '周一'
                d['v'] = '周一'
            }
            else if(rsd == 2){
                d['m'] = '周二'
                d['v'] = '周二'
            }
            else if(rsd == 3){
                d['m'] = '周三'
                d['v'] = '周三'
            }
            else if(rsd == 4){
                d['m'] = '周四'
                d['v'] = '周四'
            }
            else if(rsd == 5){
                d['m'] = '周五'
                d['v'] = '周五'
            }
            else if(rsd == 6){
                d['m'] = '周六'
                d['v'] = '周六'
            }

            applyData.push(d)
        }

        return applyData
    },
    FillChnWeek3: function(data, len, step){
        let _this = this

        let applyData = []

        for(let i = 1; i <= len; i++){
            let index = (i - 1) % data.length
            let d = $.extend(true, {}, data[index])

            let num
            if(data[data.length - 1]['m'] == '星期日'){
                num = 7 + step * i
            }
            else{
                let last = data[data.length - 1]['m']
                let txt = last.substr(last.length - 1, 1)
                num = _this.ChineseToNumber(txt) + step * i
            }

            if(num < 0){
                num = Math.ceil(Math.abs(num) / 7) * 7 + num
            }

            let rsd = num % 7
            if(rsd == 0){
                d['m'] = '星期日'
                d['v'] = '星期日'
            }
            else if(rsd == 1){
                d['m'] = '星期一'
                d['v'] = '星期一'
            }
            else if(rsd == 2){
                d['m'] = '星期二'
                d['v'] = '星期二'
            }
            else if(rsd == 3){
                d['m'] = '星期三'
                d['v'] = '星期三'
            }
            else if(rsd == 4){
                d['m'] = '星期四'
                d['v'] = '星期四'
            }
            else if(rsd == 5){
                d['m'] = '星期五'
                d['v'] = '星期五'
            }
            else if(rsd == 6){
                d['m'] = '星期六'
                d['v'] = '星期六'
            }

            applyData.push(d)
        }

        return applyData
    },
    FillChnNumber: function(data, len, step){
        let _this = this

        let applyData = []

        for(let i = 1; i <= len; i++){
            let index = (i - 1) % data.length
            let d = $.extend(true, {}, data[index])

            let num = _this.ChineseToNumber(data[data.length - 1]['m']) + step * i,
                txt
            if(num <= 0){
                txt = '零'
            }
            else{
                txt = _this.NumberToChinese(num)
            }

            d['v'] = txt
            d['m'] = txt.toString()
            applyData.push(d)
        }

        return applyData
    },
    isEqualDiff: function(arr){
        let diff = true
        let step = arr[1] - arr[0]

        for(let i = 1; i < arr.length; i++){
            if(arr[i] - arr[i - 1] != step){
                diff = false
                break
            }
        }

        return diff
    },
    isEqualRatio: function(arr){
        let ratio = true
        let step = arr[1] / arr[0]

        for(let i = 1; i < arr.length; i++){
            if(arr[i] / arr[i - 1] != step){
                ratio = false
                break
            }
        }

        return ratio
    },
    getXArr: function(len){
        let xArr = []

        for(let i = 1; i <= len; i++){
            xArr.push(i)
        }

        return xArr
    },
    forecast: function(x, yArr, xArr){
        function getAverage(arr){
            let sum = 0

            for(let i = 0; i < arr.length; i++){
                sum += arr[i]
            }

            return sum / arr.length
        }

        let ax = getAverage(xArr) //x数组 平均值
        let ay = getAverage(yArr) //y数组 平均值

        let sum_d = 0, sum_n = 0
        for(let j = 0; j < xArr.length; j++){
            //分母和
            sum_d += (xArr[j] - ax)*(yArr[j] - ay)
            //分子和
            sum_n += (xArr[j] - ax)*(xArr[j] - ax)
        }

        let b
        if(sum_n == 0){
            b = 1
        }
        else{
            b = sum_d / sum_n
        }

        let a = ay - b * ax

        return Math.round((a + b * x) * 100000) / 100000
    },
    judgeDate: function(data){
        let isSameDay = true,
            isSameMonth = true,
            isEqualDiffDays = true,
            isEqualDiffMonths = true,
            isEqualDiffYears = true
        let sameDay = dayjs(data[0]['m']).date(),
            sameMonth = dayjs(data[0]['m']).month()
        let equalDiffDays = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'days')
        let equalDiffMonths = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'months')
        let equalDiffYears = dayjs(data[1]['m']).diff(dayjs(data[0]['m']), 'years')

        for(let i = 1; i < data.length; i++){
            //日是否一样
            if(dayjs(data[i]['m']).date() != sameDay){
                isSameDay = false
            }
            //月是否一样
            if(dayjs(data[i]['m']).month() != sameMonth){
                isSameMonth = false
            }
            //日差是否是 等差数列
            if(dayjs(data[i]['m']).diff(dayjs(data[i - 1]['m']), 'days') != equalDiffDays){
                isEqualDiffDays = false
            }
            //月差是否是 等差数列
            if(dayjs(data[i]['m']).diff(dayjs(data[i - 1]['m']), 'months') != equalDiffMonths){
                isEqualDiffMonths = false
            }
            //年差是否是 等差数列
            if(dayjs(data[i]['m']).diff(dayjs(data[i - 1]['m']), 'years') != equalDiffYears){
                isEqualDiffYears = false
            }
        }

        if(equalDiffDays == 0){
            isEqualDiffDays = false
        }
        if(equalDiffMonths == 0){
            isEqualDiffMonths = false
        }
        if(equalDiffYears == 0){
            isEqualDiffYears = false
        }

        return [isSameDay, isSameMonth, isEqualDiffDays, isEqualDiffMonths, isEqualDiffYears]
    }
}

export default luckysheetDropCell
